﻿package reglas.entidades {
	
	import reglas.*;
	import reglas.movimiento.*;
	import flash.events.*;	
	
	public class EntidadControladaMovimiento extends Entidad implements IEntidadObserver
	{
		
		private static var 	VELOCIDAD_TEST:int = 350;
		
		
		public static var ESTADO_MOV_IDLE:int = 0;
		public static var ESTADO_MOV_GIRO_IZQ:int = 1;
		public static var ESTADO_MOV_GIRO_DER:int = 2;
		public static var ESTADO_MOV_ACELERAR:int = 4;
		public static var ESTADO_MOV_DESACELERAR:int = 8;
		
		public static var ESTADO_MOV_UP_IZQ:int = ESTADO_MOV_GIRO_IZQ+ESTADO_MOV_ACELERAR;
		public static var ESTADO_MOV_UP_DER:int = ESTADO_MOV_GIRO_DER+ESTADO_MOV_ACELERAR;
		public static var ESTADO_MOV_DOWN_IZQ:int = ESTADO_MOV_DESACELERAR+ESTADO_MOV_GIRO_IZQ;
		public static var ESTADO_MOV_DOWN_DER:int = ESTADO_MOV_DESACELERAR+ESTADO_MOV_GIRO_DER;
		
		
		public static var ESTADO_DISPARAR_ARMAR_PRINCIPAL:int = 16;
		
		public static var ESTADO_DESTROY:int = 128;
		
		public var currentEstado1:int = ESTADO_MOV_IDLE;
		
		
		private var observers:Array;
		
		
		public function EntidadControladaMovimiento (xx:Number, yy:Number, unNombre:String) //La velocidad solo la agrego x cuestiones de DEBUG. C/Entidad tendra esto definido
		{
			super (xx,yy,0,0,unNombre);
			observers = new Array();
			addObserver(grafico);
			notify();
		}
		
		public function addObserver (currentObserver:IEntidadObserver)
		{
			observers.push(currentObserver);
		}
		
		private function notify ()
		{
			var i:int = 0;
			var currentObserver:IEntidadObserver = null;
			for (i=0;i<observers.length;i++)
			{
				currentObserver = observers[i];				
				currentObserver.update(currentEstado1,cuerpoFisico.xReal,cuerpoFisico.yReal,cuerpoFisico.getVX(),cuerpoFisico.getVY());
			}
		}		
				
		override public function animar()
		{
			super.animar();
			//updateEstadoMovimiento (ESTADO_MOV_IDLE);
		}
		
		private function giroIzquierda()
		{
			cuerpoFisico.setVX(-VELOCIDAD_TEST);
			cuerpoFisico.setVY(0);
		}
		
		private function giroDerecha()
		{
			cuerpoFisico.setVX(+VELOCIDAD_TEST);
			cuerpoFisico.setVY(0);
		}
		
		private function acelerar()
		{
			cuerpoFisico.setVX(0);
			cuerpoFisico.setVY(-VELOCIDAD_TEST);
		}
		
		private function desacelerar()
		{
			cuerpoFisico.setVX(0);
			cuerpoFisico.setVY(+VELOCIDAD_TEST);
		}
		
		private function giroIdle()
		{
			cuerpoFisico.setVX(0);
			cuerpoFisico.setVY(0);
		}
		
		private function upIzq()
		{
			cuerpoFisico.setVX(-VELOCIDAD_TEST);
			cuerpoFisico.setVY(-VELOCIDAD_TEST);
		}
		
		private function upDer()
		{
			cuerpoFisico.setVX(+VELOCIDAD_TEST);
			cuerpoFisico.setVY(-VELOCIDAD_TEST);
		}
		
		private function downIzq()
		{
			cuerpoFisico.setVX(-VELOCIDAD_TEST);
			cuerpoFisico.setVY(+VELOCIDAD_TEST);
		}
		
		private function downDer()
		{
			cuerpoFisico.setVX(+VELOCIDAD_TEST);
			cuerpoFisico.setVY(+VELOCIDAD_TEST);
		}
		
		protected function dispararArmaPrincipal()
		{
			//TODO: La nave en si solo podria actualizar algun registro o alguna animacion,
			//recien el Objeto arma es quien realizara el disparo (quien sera un componente observer de la nave);
		}
		
		public function updateEstado1(nuevoEstadoMovimiento:int) // Controlamos la transicion de estados
		{
			if (currentEstado1==nuevoEstadoMovimiento)
			{
				//trace ("Cambio al mismo estado!");
				return;
			}
			
			trace ("CurrentEstado: "+currentEstado1+" ; NuevoEstado: "+nuevoEstadoMovimiento);
			//if (currentEstadoMovimiento==ESTADO_MOV_IDLE)
			{
				currentEstado1 = nuevoEstadoMovimiento;
				switch (currentEstado1) {
					case ESTADO_MOV_IDLE:
						giroIdle();
					break;
					case ESTADO_MOV_GIRO_IZQ:
						giroIzquierda();
					break;
					case ESTADO_MOV_GIRO_DER:
						giroDerecha();
					break;
					
					case ESTADO_MOV_ACELERAR:
						acelerar();
					break;
					case ESTADO_MOV_DESACELERAR:
						desacelerar();
					break;
					
					case ESTADO_MOV_UP_IZQ:
						upIzq();
					break;
					case ESTADO_MOV_UP_DER:
						upDer();
					break;
					case ESTADO_MOV_DOWN_IZQ:
						downIzq();
					break;
					case ESTADO_MOV_DOWN_DER:
						downDer();
					break;
					
					case ESTADO_DISPARAR_ARMAR_PRINCIPAL:
						dispararArmaPrincipal();
					break;
					
				}
			}
			
			
			
			notify();//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
			
		}
		
		override public function calcularEfectoColision (e:Event)
		{
			super.calcularEfectoColision(e);
		}
		
		public function update (nuevoEstado:int, posX:Number, posY:Number, vx:Number, vy:Number)
		{
			//Nothing yet
			if (nuevoEstado==EntidadControladaMovimiento.ESTADO_DESTROY)
			{
				destroy();
				return;
			}
			
		}
		
		
		override public function destroy ()
		{
			updateEstado1(EntidadControladaMovimiento.ESTADO_DESTROY);
			super.destroy();
			observers = null;
		}
		
	}
	
}